
    /**  
    * @Title: SpringRetryDemo.java
    * @Package com.demo.springretry
    * @Description: 
    * @author likai
    * @date 2017年5月18日
    * @version V1.0  
    */
    
package com.plug.utils.springretry;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.remoting.RemoteAccessException;
import org.springframework.retry.annotation.Backoff;
import org.springframework.retry.annotation.EnableRetry;
import org.springframework.retry.annotation.Recover;
import org.springframework.retry.annotation.Retryable;
import org.springframework.stereotype.Component;

/**
    * @ClassName: SpringRetryDemo
    * @Description: spring retry 失败重试demo
    * @author likai
    * @date 2017年5月18日
    *
    */
@Component("springretry")  
@EnableRetry//必须加上@EnableRetry才能开启重试
public class SpringRetryDemo{
	public static Logger log = LoggerFactory.getLogger(SpringRetryDemo.class);

	
	//@Retryable加在类上则全部方法有效果

    /*
     * value只有在指定异常发生时才重试
     * include:和value一样，默认空，当exclude也为空时，所有异常都重试
     * exclude:指定异常不重试，默认空，当include也为空时，所有异常都重试 
     * maxAttempts最大重试次数
     * delay延迟执行时间
     * maxDelay最大延迟执行时间
     * */
    @Retryable(value = {RemoteAccessException.class, RuntimeException.class},
               maxAttempts = 2,
               backoff = @Backoff(delay = 5000l,multiplier = 1,maxDelay=10000l))
    public  void retry1() {
		throw new RuntimeException();
	}
    public  void retry2() {
		throw new RuntimeException();
	}
    /*
     * 重试最大次数后，仍然失败，则调用@Recover注解的方法
     * @Recover一个类里面只能有一个起到效果
     * */
    @Recover
    public  void recover() {
		log.info("-------------recover-----------");
	}
}
